package org.example.day05;

import java.util.ArrayList;
import java.util.List;

/**
 * @author zlxad
 * @version 1.0
 * @description: TODO
 * <pre class="prettyprint">模拟一套简化的序列化传输方式，请实现下面的数据编码与解码过程
 * 1、编码前数据格式为[位置,类型，值]，多个数据的时候用逗号分隔，位置仅支持数字，不考虑重复等场景；类型仅支持：Integer/String/Compose（Compose的数据类型表示该存储的数据也需要编码）。
 * 2、编码后数据参考图示，数据区的格式是：位置#类型#长度#数，类型存储需要编码，Integer-&gt;0;String-&gt;1;Compose-&gt;2 长度是指数据的字符长度；数据仅允许数字、大小写字母、空格。
 * <div>
 * <img alt="" height="109" src="https://uploadfiles.nowcoder.com/images/20200716/329232_1594891854278_7269932FDD7F8BA760B50D8A119A60C0" title="" width="403">
 * </div>
 * 3、输入的<span>编码字符长度不能超过1000，一个数据的格式错误，则解析剩下数据，其他错误输出ENCODE_ERROR。
 * 4、输入的解码字符不能超过1000，</span>数据区异常则跳过继续解析剩余数据区，其他异常输出DECODE_ERROR。</pre> <br>
 * @date 2024/3/11 15:21
 */
public class test081 {
    // 编码函数
    public static String encode(List<String[]> data) {
        StringBuilder encoded = new StringBuilder();
        for (String[] item : data) {
            // 判断数据是否符合要求
            if (item.length != 3 || !item[0].matches("\\d+") || !item[1].matches("(Integer|String|Compose)")) {
                return "ENCODE_ERROR";
            }

            // 数据位置
            encoded.append(item[0]).append("#");

            // 数据类型
            if ("Integer".equals(item[1])) {
                encoded.append("0");
            } else if ("String".equals(item[1])) {
                encoded.append("1");
            } else {
                encoded.append("2");
            }
            encoded.append("#");

            // 数据长度
            encoded.append(item[2].length()).append("#");

            // 数据值
            encoded.append(item[2]).append(",");
        }

        return encoded.toString();
    }

    // 解码函数
    public static String decode(String encoded) {
        StringBuilder decoded = new StringBuilder();
        String[] items = encoded.split(",");
        for (String item : items) {
            String[] parts = item.split("#");
            // 判断数据区格式是否正确
            if (parts.length != 4 || !parts[0].matches("\\d+") || !parts[1].matches("[0-2]") || !parts[2].matches("\\d+")) {
                continue; // 跳过错误的数据区
            }

            // 解析数据类型
            String type;
            if ("0".equals(parts[1])) {
                type = "Integer";
            } else if ("1".equals(parts[1])) {
                type = "String";
            } else {
                type = "Compose";
            }

            // 解析数据值
            String value = parts[3].substring(0, Integer.parseInt(parts[2]));

            // 将解析出的数据添加到结果中
            decoded.append("[").append(parts[0]).append(",").append(type).append(",").append(value).append("]");
        }

        return decoded.toString();
    }

    public static void main(String[] args) {
        // 测试数据
        List<String[]> data = new ArrayList<>();
        data.add(new String[]{"1", "Integer", "123"});
        data.add(new String[]{"2", "String", "Hello"});
        data.add(new String[]{"3", "Compose", "456"});
        data.add(new String[]{"4", "Integer", "789"});

        // 编码测试数据
        String encodedData = encode(data);
        System.out.println("编码结果：" + encodedData);

        // 解码测试数据
        String decodedData = decode(encodedData);
        System.out.println("解码结果：" + decodedData);
    }
}
